﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

using Neto.Db.SqlSugar;

namespace Neto.Application.Api;

/// <summary>
///     数据配置
/// </summary>
[Authorize] //jwt授权
[ApiDescriptionSettings("Api", Name = "SysDataConfig")]
[ApiArea()]
[PgApiController("数据配置服务", area: "Api", MenuPCode = "Sys_Setting")]
//[PgApiMenu("数据配置", "UrlKey_ApiSysDataConfig", "Api")]
//[Route("Api/[controller]/[action]")]
[PgApiMenu("数据配置管理", "sys-setting_sys-data-config", MenuPCode = "Sys_Setting",
    Icon = "material-symbols:contextual-token", Sort = 3)]
public class ApiSysDataConfigService(ISqlSugarClient db)
    : IDynamicApiController
{
    /// <summary>
    ///     新增一条
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [PgApiAction("新增一条")]
    [OperationId(nameof(Insert))]
    public async Task<long> Insert(ApiSysDataConfigInput input)
    {
        //验证 父级下 唯一 Key是否存在
        var isexit = await db.Queryable<SysDataConfig>().AnyAsync(o => o.PId == input.PId && o.Key == input.Key);
        if (isexit) throw Oops.Bah("唯一标识Key不能重复");
        var addentity = input.Adapt<SysDataConfig>();
        return await db.InsertRsIdAsync(addentity);
    }

    /// <summary>
    ///     更新一条
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [PgApiAction("更新一条")]
    [OperationId(nameof(Update))]
    [HttpPut]
    public async Task<bool> Update(ApiSysDataConfigInput input)
    {
        //验证 父级下 唯一 Key是否存在
        var isexit = await db.Queryable<SysDataConfig>()
            .AnyAsync(o => o.PId == input.PId && o.Key == input.Key && o.Id != input.Id);
        if (isexit) throw Oops.Bah("唯一标识Key不能重复");
        var dbentity = await db.Queryable<SysDataConfig>().With(SqlWith.Null).FirstAsync(o => o.Id == input.Id.Value);
        input.Adapt(dbentity);
        return await db.UpdateAsync(dbentity);
    }


    /// <summary>
    ///     删除一条
    /// </summary>
    /// <param name="id"></param>
    [PgApiAction("删除一条")]
    [OperationId(nameof(Delete))]
    public async Task<bool> Delete(long id)
    {
        // if (id <= 0) throw Oops.Bah("id不能为0");
        // return  await db.DeleteByIdAsync<SysDataConfig>(id);
        return await db.FakeDeleteAsync<SysDataConfig>($"{id}");
    }

    ///// <summary>
    ///// 批量删除
    ///// </summary>
    ///// <param name="ids">需要删除的数据，多条以英文逗号隔开</param>
    //[PgApiAction(name: "批量删除")]
    //[OperationId(nameof(BatchDelete))]
    //public async Task<bool> BatchDelete(string ids)
    //{
    //    //return await db.DeleteByIdsAsync<SysDataConfig>(ids);
    //    return await db.FakeDeleteAsync<SysDataConfig>(ids);
    //}

    /// <summary>
    ///     查询一条
    /// </summary>
    /// <param name="id"></param>
    [PgApiAction("查询一条")]
    [HttpPost]
    [OperationId(nameof(Get))]
    public async Task<ApiSysDataConfigOut> Get(long id)
    {
        /* 多表关联的一个写法，当然也可以用导航写法
         var query5 = await db.Queryable<SysDataConfig>()
           //.LeftJoin<Custom>   ((o, cus ) => o.CustomId == cus.Id)//多个条件用&&
           //.LeftJoin<OrderDetail> ((o, cus, oritem) => o.Id == oritem.OrderId)
           .Where(o => o.Id == id)
           .Select((o) => new ApiSysDataConfigOut {
                Id = o.Id.SelectAll(), //Id是o任意一个属性
                //CustomName = cus.Name,
            })
           .FirstAsync();
        */

        return await db.GetByIdAsync<SysDataConfig, ApiSysDataConfigOut>(id);
    }


    /// <summary>
    ///     获取数据配置
    /// </summary>
    /// <param name="searchQuery"></param>
    /// <returns></returns>
    [PgApiAction("获取数据配置")]
    [HttpPost]
    [OperationId(nameof(GetTreeList))]
    public async Task<List<ApiSysDataConfigOut>> GetTreeList(ApiSysDataConfigQuery searchQuery)
    {
        var queryable = db.Queryable<SysDataConfig>();

        #region 筛选条件

        //开始日期
        if (searchQuery.StartDate.HasValue)
            queryable = queryable.Where(o => o.CreationTime >= searchQuery.StartDate.Value);
        //结束日期
        if (searchQuery.EndDate.HasValue)
            queryable = queryable.Where(o => o.CreationTime <= searchQuery.EndDate.ToDayEndTime());
        //关键词
        if (!string.IsNullOrWhiteSpace(searchQuery.KeyWords))
        {
            var kw = searchQuery.KeyWords?.Trim()?.ToLower() ?? "";
            queryable = queryable.Where(o => o.Name.Contains(kw));
        }

        #endregion

        var pagelist = await queryable.Select(o => new ApiSysDataConfigOut
                {
                    Id = o.Id.SelectAll(),

                    #region 自定义

                    //IsEnableName =  o.IsEnable?"是":"否"  ,//是否启用 
                    //IsDeletedName =  o.IsDeleted?"是":"否"  ,//默认假删除 

                    #endregion
                })
                .Mapper(src =>
                {
                })
                .OrderBy(o => new { o.Sort, o.Id })
                .ToTreeAsync(it => it.Children, it => it.PId, 0, it => it.Id)
            ;


        //var pagelist= await pageResult.ToPagedListAsync<SysDataConfig, ApiSysDataConfigOut>(searchQuery.PageIndex, searchQuery.PageSize);

        return pagelist;
    }


    ///// <summary>
    ///// 设置状态
    ///// </summary>
    ///// <param name="id"></param>
    ///// <param name="state"></param>
    ///// <returns></returns>
    //[PgApiAction(name: "设置启用状态")]
    //[OperationId(nameof(SetIsEnable))]
    //public async Task<bool> SetIsEnable(long id, bool state)
    //{
    //    return await db.SetStateByIdAsync<SysDataConfig>(id, state, "IsEnable");
    //}

    #region 冗余方法

    ///// <summary>
    ///// 查询所有
    ///// </summary>
    ///// <returns></returns>
    //[PgApiAction(name: "查询所有")]
    //[OperationId(nameof(GetAll))]
    //public async Task<List<ApiSysDataConfigOut>> GetAll()
    //{
    //    return await db.GetListAsync<SysDataConfig, ApiSysDataConfigOut>();
    //}

    ///// <summary>
    ///// 获取下拉选项
    ///// </summary>
    ///// <returns></returns>
    //[PgApiAction(name: "获取下拉选项")]
    //[HttpPost]
    //[OperationId(nameof(GetSelectItems))]
    //public async Task<Dictionary<string, object>> GetSelectItems()
    //{
    //    var dics = await db.Queryable<SysDataConfig>().ToDictionaryAsync(o => o.Id, v => v.Title);
    //    return dics;
    //}

    #endregion
}